/*
 * Interface del servicio de OCP
 */

package ocp.service;

import java.util.Vector;
import ocp.context.Context;


/**
 * Interfaz de acceso a los servicios de OCP
 * @author Paco Lopez Marmol
 */
public interface ContextService {
    
    /**
     * Lee un contexto
     * @param id id del contexto
     * @return el contexto
     */
    public Context read(String id);
    
    /**
     * Escribe un contexto
     * @param context el contexto
     * @return true si se escribe el contexto
     */
    public void write(Context context);    
    
    /**
     * Registrarse a los cambios de un contexto concreto
     * @param id Identificador del contexto en el que estamos interesados
     * @param cl Interfaz del consumidor de contexto que recibirá las notificaciones
     * @return true si se registro correctamente. false si el contexto no existe
     */
    public boolean register(String id,ContextConsumer cl);
    
    /**
     * Subscribe un oyente(ContextConsumer) a un tipo de contexto
     * @param contextType tipo del contexto (ej. Medicamento en Medicamento-12132)
     * @param cl Oyente que implementa la interfaz ContextConsumer
     */
    public void registerToContextType(String contextType, ContextConsumer cl);

    /**
     * Obtiene el número de contextos almacenados en el historico de un 
     * contexto concreto.
     * @param id Identificador del contexto
     * @return Número de contextos almacenados
     */
    public int getHistoricalContextLenght(String id);
    
    /** 
     * Lee los últimos valores del historico de un contexto
     * @param id Identificador del contexto
     * @param nitems Número de contextos a leer
     * @return Un vector de contextos ordenado de menos reciente a más reciente
     */
    public Vector<Context> readHistoricalContextLast(String id,int nitems);
    
    /*
    public Vector<Context> readLast(String id,int nitems);
    public Interval getHistoricalInterval(String id);  // ineficiente
    public Context getHistoricalByIndex(String id, int index);  // ineficiente
    public int getCountHistorical(String id); 
    public Vector getHContext(String id, long begin, long end); // ineficiente
     */
//    public boolean registerIdPattern(String pattern,ContextConsumer cl);
//    public boolean registerIdRegExpr(String pattern,ContextConsumer cl);
    
    /**
     * Desregistrarse a los cambios de un contexto concreto
     * @param id Identificador del contexto 
     * @param cl Interfaz del consumidor de contexto 
     * @return true si se desregistro correctamente. 
     */
    public boolean unregister(String id,ContextConsumer cl);
    
}
